package com.zjzaki.thingsboard.ui;

import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * LineChart简单封装
 */
public class CreationChart {
    /**
     * 折线图组件
     */
    private LineChart chart;
    /**
     * 数据列表
     */
    private List<String> dateTime = new ArrayList<>();

    /**
     * 构造函数
     *
     * @param chart 折线图组件
     */
    public CreationChart(LineChart chart) {
        this.chart = chart;
    }

    /***
     * 初始化
     */
    public void init() {
        //设置无数据时的提示文字
        chart.setNoDataText("无数据");
        // 开启文本描述
        chart.getDescription().setEnabled(false);
        //减速摩擦系数在[0;1] interval，较高的值表示速度将缓慢下降，例如，如果它设置为0，它将立即停止。1是一个无效的值，它将自动转换为0.999f。
        chart.setDragDecelerationFrictionCoef(0.9f);
        // 开启触摸手势
        chart.setTouchEnabled(true);
        // 允许缩放和拖动
        chart.setDragEnabled(true); //拖动
        chart.setScaleEnabled(false); //缩放
        //绘制网格线
        chart.setDrawGridBackground(false);
        //拖动时高亮
        chart.setHighlightPerDragEnabled(true);
        // 如果禁用，可以分别在x轴和y轴上进行缩放
        chart.setPinchZoom(true);
        // 设置一个替代背景
        //chart.setBackgroundColor(Color.rgb(255, 255, 255));
        LineData data = new LineData();
        //设置值的文字颜色
        data.setValueTextColor(Color.WHITE);

        // X轴
        XAxis xl = chart.getXAxis();
        xl.setPosition(XAxis.XAxisPosition.BOTTOM);//标签位置
        xl.setTextColor(Color.WHITE); // x值为白色
        xl.setDrawGridLines(false);
        //x轴的坐标个数
        xl.setLabelCount(4,false); //分为几个
        xl.setAxisLineColor(Color.rgb(248, 248, 255)); //x线的颜色
        //xl.setGranularity(3f);
        xl.setAvoidFirstLastClipping(true);
        xl.setEnabled(true);

        //左边的Y轴数据
        YAxis leftAxis = chart.getAxisLeft();
        leftAxis.setTextColor(Color.WHITE);
        //leftAxis.setAxisMaximum(200f); //最大条目
        leftAxis.setAxisMinimum(0f);//最小条目
        leftAxis.setLabelCount(6);//设置最大分为几格
        leftAxis.setDrawGridLines(true);
        leftAxis.setAxisLineColor(Color.rgb(248, 248, 255));
        //右边的Y轴数据
        YAxis rightAxis = chart.getAxisRight();
        rightAxis.setEnabled(false);

        //设置限制临界线
        LimitLine limitLine = new LimitLine(3f, "");//临界点
        limitLine.setLineColor(Color.RED);
        limitLine.setLineWidth(1.5f);
        limitLine.setTextColor(Color.RED);
        //LimitLine avgLine = new LimitLine((float) navg);
        //avgLine.enableDashedLine(5.0f, 3.0f, 3.0f);
        //avgLine.setLineColor(Color.parseColor("#33CC33"));
        chart.getAxisLeft().addLimitLine(limitLine);


    }

    ///**
    // * 添加数据
    // *
    // * @param data
    // */
    //public void addData(float... data) {
    //    //获取当前时间  格式为“HH:mm:ss”
    //    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
    //    String date = formatter.format(new Date());
    //    dateTime.add(date);
    //    LineDataSet newDataSet, newDataSet2;
    //    chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(dateTime));
    //
    //    switch (data.length) {
    //        // 单折线
    //        case 1:
    //            if (chart.getData() != null &&
    //                    chart.getData().getDataSetCount() > 0) {
    //                newDataSet = (LineDataSet) chart.getData().getDataSetByIndex(0);
    //                newDataSet.addEntry(new Entry(newDataSet.getEntryCount(), data[0]));
    //            } else {
    //                newDataSet = createSet(LineChartType.CHART1);
    //                LineData lineData1 = new LineData(newDataSet);
    //                chart.setData(lineData1);
    //            }
    //            break;
    //        // 多折线
    //        case 2:
    //            if (chart.getData() != null &&
    //                    chart.getData().getDataSetCount() > 0) {
    //                newDataSet = (LineDataSet) chart.getData().getDataSetByIndex(0);
    //                newDataSet2 = (LineDataSet) chart.getData().getDataSetByIndex(1);
    //                newDataSet.addEntry(new Entry(newDataSet.getEntryCount(), data[0]));
    //                newDataSet2.addEntry(new Entry(newDataSet2.getEntryCount(), data[1]));
    //            } else {
    //                newDataSet = createSet(LineChartType.CHART1);
    //                newDataSet2 = createSet(LineChartType.CHART2);
    //                LineData lineData1 = new LineData(newDataSet, newDataSet2);
    //                chart.setData(lineData1);
    //            }
    //            break;
    //    }
    //    chart.getData().notifyDataChanged();
    //    //提交数据更新
    //    chart.notifyDataSetChanged();
    //    //设置X最大可见条目
    //    chart.setVisibleXRange(2, 5);
    //    //移动到最新数据
    //    if (chart.getData().getDataSetByIndex(0).getEntryCount() > 0)
    //        chart.moveViewToX(chart.getData().getDataSetByIndex(0).getEntryCount());
    //}

    /**
     * 添加数据
     *
     * @param time 时间
     * @param temp 温度数据
     */
    public void addData(Long time, float temp) {

        //获取当前时间  格式为“HH:mm:ss”
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
        //时间戳转换成HH:mm:ss
        String date = formatter.format(new Date(time));
        //添加到时间数据列表中
        dateTime.add(date);
        //折线图数据结合
        LineDataSet newDataSet;

        //设置x轴标签
        chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(dateTime));

        // 单折线
        if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {
            //得到原数据集合
            newDataSet = (LineDataSet) chart.getData().getDataSetByIndex(0);
            // 得到所有的颜色集合
            List<Integer> circleColors = newDataSet.getCircleColors();
            if (temp > 1){
                circleColors.add(Color.RED);
            }else {
                circleColors.add(Color.GREEN);
            }
            //设置数据颜色
            newDataSet.setCircleColors(circleColors);
            //添加数据
            newDataSet.addEntry(new Entry(newDataSet.getEntryCount(), temp));

        } else {
            newDataSet = createSet(LineChartType.CHART1);
            LineData lineData1 = new LineData(newDataSet);
            List<Integer> list = new ArrayList<>();
            if (temp > 1){
                list.add(Color.RED);
            }else {
                list.add(Color.GREEN);
            }
            newDataSet.setCircleColors(list);

            newDataSet.addEntry(new Entry(newDataSet.getEntryCount(),temp));
            chart.setData(lineData1);
        }

        newDataSet.setValueFormatter(new IValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {

                return value + "℃";
            }
        });

        ////是否画折线点上的空心圆 false表示直接化成实心圆
        //newDataSet.setDrawCircleHole(false);
        //newDataSet.setCircleRadius(3);//空心圆的半径
        //
        ////圆点颜色 可以实现超过某个值定义成某个颜色
        //newDataSet.setCircleColor(Color.GREEN);
        //newDataSet.setCircleRadius(3);//圆点半径

        //更新数据
        chart.getData().notifyDataChanged();
        //提交数据更新
        chart.notifyDataSetChanged();
        //设置X最大可见条目
        chart.setVisibleXRange(0, 5);
        //移动到最新数据
        if (chart.getData().getDataSetByIndex(0).getEntryCount() > 0){
            chart.moveViewToX(chart.getData().getDataSetByIndex(0).getEntryCount());
        }
    }

    /**
     * 设置数据格式
     *
     * @param type chart1 或者 chart2
     * @return LineDataSet
     */
    private LineDataSet createSet(LineChartType type) {
        LineDataSet set = null;
        switch (type) {
            case CHART1:
                set = new LineDataSet(null, "温度");
//                set.setColor(ColorTemplate.getHoloBlue()); //折线颜色
                set.setColor(Color.YELLOW); //折线颜色
                set.setFillAlpha(65);//填充透明度
//                set.setFillColor(ColorTemplate.getHoloBlue());
                set.setFillColor(ColorTemplate.colorWithAlpha(Color.YELLOW, 200));
                break;
            case CHART2:
                set = new LineDataSet(null, "测试2");
                set.setColor(Color.YELLOW); //折线颜色
                set.setFillAlpha(65);//填充透明度
                set.setFillColor(ColorTemplate.colorWithAlpha(Color.YELLOW, 200));
                break;
        }
        set.setAxisDependency(YAxis.AxisDependency.LEFT);
        set.setLineWidth(1f);
        set.setCircleRadius(4f);
        set.setHighLightColor(Color.rgb(124, 117, 117));//高亮颜色
        set.setDrawValues(true); //绘画值
        //set.setDrawCircles(false); //绘画圆圈
        set.setDrawFilled(true); //充满底部

        set.setValueTextSize(12);

        //是否画折线点上的空心圆 false表示直接化成实心圆
        set.setDrawCircleHole(false);
        set.setCircleRadius(3);//空心圆的半径

        //圆点颜色 可以实现超过某个值定义成某个颜色
        //set.setCircleRadius(3);//圆点半径

        set.setMode(LineDataSet.Mode.CUBIC_BEZIER);  // 类型，折线还是曲线还是 平线
        return set;
    }

    /**
     * 枚举类型
     */
    private enum LineChartType {
        CHART1, CHART2
    }
}

